package com.cardcaptorsakura.model.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 图像生成响应DTO
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImageGenerationResponse {

    /**
     * 生成的图像URL
     */
    private String imageUrl;

    /**
     * 本地保存路径
     */
    private String localPath;

    /**
     * 实际使用的提示词
     */
    private String prompt;

    /**
     * 原始提示词
     */
    private String originalPrompt;

    /**
     * 图像宽度
     */
    private Integer width;

    /**
     * 图像高度
     */
    private Integer height;

    /**
     * 图像风格
     */
    private String style;

    /**
     * 图像质量
     */
    private String quality;

    /**
     * 文件大小（字节）
     */
    private Long fileSize;

    /**
     * 文件格式
     */
    private String format;

    /**
     * 生成时间
     */
    private LocalDateTime generatedAt;

    /**
     * 生成耗时（毫秒）
     */
    private Long processingTime;

    /**
     * 使用的种子值
     */
    private Long seed;

    /**
     * 引导强度
     */
    private Double guidanceScale;

    /**
     * 推理步数
     */
    private Integer steps;

    /**
     * 采样器类型
     */
    private String sampler;

    /**
     * 图像哈希值（用于去重）
     */
    private String imageHash;

    /**
     * 缩略图路径
     */
    private String thumbnailPath;

    /**
     * 图像标签
     */
    private List<String> tags;

    /**
     * 图像评分（质量评估）
     */
    private Double qualityScore;

    /**
     * 是否包含敏感内容
     */
    private Boolean hasSensitiveContent;

    /**
     * 内容安全检查结果
     */
    private ContentSafetyResult safetyResult;

    /**
     * 生成状态
     */
    @Builder.Default
    private GenerationStatus status = GenerationStatus.SUCCESS;

    /**
     * 错误信息（如果生成失败）
     */
    private String errorMessage;

    /**
     * 元数据
     */
    private java.util.Map<String, Object> metadata;

    /**
     * 生成状态枚举
     */
    public enum GenerationStatus {
        SUCCESS,    // 成功
        FAILED,     // 失败
        PENDING,    // 处理中
        FILTERED    // 被内容过滤器拦截
    }

    /**
     * 内容安全检查结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ContentSafetyResult {
        /**
         * 是否安全
         */
        private Boolean isSafe;

        /**
         * 风险等级（LOW, MEDIUM, HIGH）
         */
        private String riskLevel;

        /**
         * 检测到的问题类型
         */
        private List<String> detectedIssues;

        /**
         * 置信度分数
         */
        private Double confidenceScore;

        /**
         * 详细说明
         */
        private String description;
    }

    /**
     * 获取下载URL
     */
    public String getDownloadUrl() {
        if (localPath != null) {
            // 构建下载URL
            String[] pathParts = localPath.split("/");
            if (pathParts.length >= 3) {
                String userId = pathParts[pathParts.length - 2];
                String filename = pathParts[pathParts.length - 1];
                return "/api/output/image/download/" + userId + "/" + filename;
            }
        }
        return imageUrl;
    }

    /**
     * 获取缩略图URL
     */
    public String getThumbnailUrl() {
        if (thumbnailPath != null) {
            String[] pathParts = thumbnailPath.split("/");
            if (pathParts.length >= 3) {
                String userId = pathParts[pathParts.length - 2];
                String filename = pathParts[pathParts.length - 1];
                return "/api/output/image/download/" + userId + "/" + filename;
            }
        }
        return getDownloadUrl();
    }

    /**
     * 检查是否生成成功
     */
    public boolean isSuccess() {
        return status == GenerationStatus.SUCCESS;
    }

    /**
     * 检查是否被过滤
     */
    public boolean isFiltered() {
        return status == GenerationStatus.FILTERED;
    }

    /**
     * 获取文件扩展名
     */
    public String getFileExtension() {
        if (localPath != null) {
            int lastDotIndex = localPath.lastIndexOf('.');
            if (lastDotIndex > 0) {
                return localPath.substring(lastDotIndex + 1).toLowerCase();
            }
        }
        return format != null ? format.toLowerCase() : "png";
    }

    /**
     * 获取人类可读的文件大小
     */
    public String getHumanReadableFileSize() {
        if (fileSize == null) {
            return "未知";
        }
        
        if (fileSize < 1024) {
            return fileSize + " B";
        } else if (fileSize < 1024 * 1024) {
            return String.format("%.1f KB", fileSize / 1024.0);
        } else {
            return String.format("%.1f MB", fileSize / (1024.0 * 1024.0));
        }
    }

    /**
     * 获取人类可读的处理时间
     */
    public String getHumanReadableProcessingTime() {
        if (processingTime == null) {
            return "未知";
        }
        
        if (processingTime < 1000) {
            return processingTime + " ms";
        } else {
            return String.format("%.1f s", processingTime / 1000.0);
        }
    }
}